package String.easy;

/**
 * 1. 问题描述
 *       在一个「平衡字符串」中，'L' 和 'R' 字符的数量是相同的。
 *       给出一个平衡字符串 s，请你将它分割成尽可能多的平衡字符串。
 *       返回可以通过分割得到的平衡字符串的最大数量。
 *
 * 2. 算法分析
 *      简单的模拟一下代码的过程：
 *             s = R L R R L L R L R L
 *                 i
 *
 *         第一轮外层while循环
 *             初始化 j = i = 0,由于当前的i指向的是R，所以第一个平衡字符串以R开头
 *             让i开始向后移动，直到i指向的字符为L
 *             循环退出时的图示
 *                 R L R R L L R L R L
 *                   i
 *             此时找到了第一个平衡字符串 RL   count = 1
 *             len - 2
 *             让i指针向后移动一位之后继续下一轮的while循环
 *                 R L R R L L R L R L
 *                     i（下一轮的起点）
 *
 *         第二轮外层while循环
 *             初始化 j = i = 2，由于当前i指向的是R，所以第二个平衡字符串还是以R开头
 *             让i开始向后移动。直到i指向的字符为L
 *             循环退出时的图示：
 *                 R L R R L L R L R L
 *                         i
 *         知道下面的代码错误在哪里了：
 *             大致的方向没有问题，但是在代码中在一个while循环之后i不是移动1而是移动当前平衡字串长度的一半
 *             就是i之前走过的路程，所以每一轮while循环我们需要设置一个临时变量temp来记录所以i做过的路程，
 *             然后让i在一轮while之后继续移动temp位索引，让后让temp重置为0
 *
 *         还是不行，代码结果可以跑通，但是结果不对
 *
 *         思考像这类平衡问题的切入点是什么呢?
 *             最简单的平衡字符串为RL/LR，如果设置一个平衡变量 balance = 0
 *             如果遇到R加1，遇到L减1，如果当前字串是平横的，最终balance为0
 *             即每次我们在遍历的过程中判断balance，如果当前的balance为0，说明
 *             我们找到了一个平衡的字串，让计数器加1
 *         对于这种套路我之前貌似遇到过，但是此题还是没有想到这种方法，上述的方法思路肯定是可以的，虽然代码
 *         没有报错，但是最后的结果不对，总少记录一个，目前还没有发现逻辑错误之处在哪里
 *
 *         对于具有对称性的字符串的相关题目，都可以试试这个方法设置一个平衡变量，如果是条件A，让变量+1
 *         如果是条件B，让变量-1，一轮之后判断当前变量是否为0，如果为零说明我们找到了一个满足条件的字串
 *
 * 3. 代码实现
 *
 */
@SuppressWarnings("all")
public class 分割平衡字符串 {
    public static void main(String[] args) {
        System.out.println(balancedStringSplit("LLLLRRRR"));
    }

    /**
     * @param s
     * @return
     */
    public static int balanceString(String s){
        int balance = 0;
        int count = 0;
        for(int i = 0; i < s.length(); i++) {
            if(s.charAt(i) == 'R') {
                balance += 1;
            } else {
                balance -= 1;
            }
            if(balance == 0) {
                count++;
            }
        }
        return count;
    }

    public static int balancedStringSplit(String s) {
        if(s.length() == 0 || s.length() == 1) {return 0;}
        // 判断当前字符串是否是一个平衡字符串 由题意表明可以不做判断，因为默认我们处理的就是一个平衡的
        // 如果需要做判断可以使用indexOf方法的返回值来判断
        int count = 0; // 记录平衡子串的个数
        int i = 0;
        int len = s.length(); // 记录字符串的长度，用于判断循环的结束标志
        while(len > 0 && i < len) {
            if(s.charAt(i) == 'R') {
                while(s.charAt(i) == 'R') {
                    i++;
                }
                len -= i;
                count++;
            } else {
                while(s.charAt(i) == 'L') {
                    i++;
                }
                len -= i;
                count++;
            }
            i++;
        }
        return count;
    }
}
